#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QLabel>
#include <QProgressBar>
#include <QPushButton>
#include <QDockWidget>
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 存在就获取, 不存在就创建
    QStatusBar* statusBar = this->statusBar();
    // 如果状态栏没有被创建, 这样的设置是必要的.
    // 如果状态栏已经在窗口中存在, 这样的设置其实意义不大, 但是也没副作用. 仍然保留.
    this->setStatusBar(statusBar);

    /* 显示一个临时的信息.
     * 通过 showMessage 可以在状态栏中显示一个文本此时这个文本存在的时间可以自定义.
     * timeout 参数是一个单位为 ms 的时间如果 timeout 为 0(不填)，消息就会持久存在
     */
    // statusBar->showMessage("这是一个状态消息", 3000);

    // 给状态栏中添加子控件
    QLabel* label = new QLabel("这是一个 QLabel");
    statusBar->addWidget(label, 1);
    // 1:2 分开
    // QLabel* label2 = new QLabel("这个是另一个 QLabel");
    // statusBar->addWidget(label2, 2);

    QProgressBar* progressBar = new QProgressBar();
    progressBar->setRange(0, 100);
    progressBar->setValue(50);
    statusBar->addWidget(progressBar);

    QPushButton* button = new QPushButton("按钮");
    statusBar->addPermanentWidget(button);


    // 给主窗口添加一个子窗口.
    QDockWidget* dockWidget = new QDockWidget();
    // 使用 addDockWidget 方法, 把浮动窗口加入到子窗口中.
    this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

    // 浮动窗口也是可以设置标题的.
    dockWidget->setWindowTitle("这是浮动窗口");

    // 给浮动窗口内部, 添加一些其他的控件.
    // 不能直接给这个浮动窗口添加子控件, 而是需要创建出一个单独的 QWidget, 把要添加的控件加入到 QWidget 中.
    // 然后再把这个 QWidget 设置到 dockWidget 中.
    QWidget* container = new QWidget();
    dockWidget->setWidget(container);
    // 由于 dockWidget 中只能包含一个 QWidget
    // 要想添加更多的控件就只能往 QWidget 中进行添加了(多套一层)

    // 创建布局管理器, 把布局管理器设置到 QWidget 中
    QVBoxLayout* layout = new QVBoxLayout;
    container->setLayout(layout);

    // 创建其他控件添加到 layout 中.
    QLabel* label3 = new QLabel("这是一个 QLabel");
    QPushButton* button1 = new QPushButton("这是按钮");
    layout->addWidget(label3);
    layout->addWidget(button1);

    // 设置浮动窗口允许停靠的位置
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}

MainWindow::~MainWindow()
{
    delete ui;
}

